﻿using System.Collections.Generic;
using HK.Core.Common.Data;
using HK.Core.Common.Protocol;
using HK.Core.Common.Protocol.Data;
using HK.Core.Encryption.Protocol;
using HK.Core.Serializable.Protocol.Data;

namespace HK.Core.Network.Download.Protocol.Data
{
    /// <summary>
    /// 接口 : 下载文件描述
    /// </summary>
    public interface IDownloadFileDesc : IJsonData
    {
        /// <summary>
        /// 路径
        /// <para>* 相对路径</para>
        /// </summary>
        string Path { get; }
        
        /// <summary>
        /// 校验码 - Crc
        /// </summary>
        uint Crc { get; }
        
        /// <summary>
        /// 大小
        /// <para>* 单位 : Byte</para>
        /// </summary>
        long Size { get; }
    }
    
    /// <summary>
    /// 接口 : 下载描述
    /// </summary>
    public interface IDownloadDesc<TFile> : IJsonData
        where TFile : JsonData, IDownloadFileDesc
    {
        /// <summary>
        /// 日期
        /// <para>* 测试时频繁更新文件，此信息对检查是否是CDN缓存重要</para>
        /// </summary>
        string Date { get; }
        
        /// <summary>
        /// 上传者/创建者
        /// </summary>
        string Author { get; }
        
        /// <summary>
        /// 补丁包版本
        /// </summary>
        ISAssetVersion PathVer { get; }
        
        /// <summary>
        /// 母包版本
        /// </summary>
        ISAssetVersion OriginVer { get; }
        
        /// <summary>
        /// 描述文件版本号
        /// </summary>
        byte DescVer { get; }
        
        /// <summary>
        /// 总大小
        /// <para>* 单位 : Byte</para>
        /// </summary>
        long TotalSize { get; }
        
        /// <summary>
        /// 校验码 - Crc
        /// </summary>
        uint Crc { get; }
        
        /// <summary>
        /// 总个数
        /// <para>* 既:下载列表文件数</para>
        /// </summary>
        int TotalCount { get; }
        
        /// <summary>
        /// 下载文件列表
        /// </summary>
        List<TFile> List { get; }

        /// <summary>
        /// 追加下载文件描述信息
        /// </summary>
        /// <param name="iFileDesc">文件描述信息</param>
        void AddDownloadFileDesc(TFile iFileDesc);
    }
}
